1 /*
2   D bindings for CUDA.
3   Authors:    Prasun Anand
4   Copyright:  Copyright (c) 2017, Prasun Anand. All rights reserved.
5   License:    BSD 3-Clause License
6 */
7 
8 module cuda_d.cublas;
9 
10 import cuda_d.cublas_api;
11 import cuda_d.cuComplex;
12 
13 extern (C):
14 
15 /* CUBLAS data types */
16 alias cublasStatus_t cublasStatus;
17 
18 cublasStatus_t cublasInit ();
19 cublasStatus_t cublasShutdown ();
20 cublasStatus_t cublasGetError ();
21 
22 cublasStatus_t cublasGetVersion (int* version_);
23 cublasStatus_t cublasAlloc (int n, int elemSize, void** devicePtr);
24 
25 cublasStatus_t cublasFree (void* devicePtr);
26 
27 cublasStatus_t cublasSetKernelStream (cudaStream_t stream);
28 
29 /* ---------------- CUBLAS BLAS1 functions ---------------- */
30 /* NRM2 */
31 float cublasSnrm2 (int n, const(float)* x, int incx);
32 double cublasDnrm2 (int n, const(double)* x, int incx);
33 float cublasScnrm2 (int n, const(cuComplex)* x, int incx);
34 double cublasDznrm2 (int n, const(cuDoubleComplex)* x, int incx);
35 /*------------------------------------------------------------------------*/
36 /* DOT */
37 float cublasSdot (int n, const(float)* x, int incx, const(float)* y, int incy);
38 double cublasDdot (
39     int n,
40     const(double)* x,
41     int incx,
42     const(double)* y,
43     int incy);
44 cuComplex cublasCdotu (
45     int n,
46     const(cuComplex)* x,
47     int incx,
48     const(cuComplex)* y,
49     int incy);
50 cuComplex cublasCdotc (
51     int n,
52     const(cuComplex)* x,
53     int incx,
54     const(cuComplex)* y,
55     int incy);
56 cuDoubleComplex cublasZdotu (
57     int n,
58     const(cuDoubleComplex)* x,
59     int incx,
60     const(cuDoubleComplex)* y,
61     int incy);
62 cuDoubleComplex cublasZdotc (
63     int n,
64     const(cuDoubleComplex)* x,
65     int incx,
66     const(cuDoubleComplex)* y,
67     int incy);
68 
69 /*------------------------------------------------------------------------*/
70 /* SCAL */
71 void cublasSscal (int n, float alpha, float* x, int incx);
72 void cublasDscal (int n, double alpha, double* x, int incx);
73 void cublasCscal (int n, cuComplex alpha, cuComplex* x, int incx);
74 void cublasZscal (int n, cuDoubleComplex alpha, cuDoubleComplex* x, int incx);
75 
76 void cublasCsscal (int n, float alpha, cuComplex* x, int incx);
77 void cublasZdscal (int n, double alpha, cuDoubleComplex* x, int incx);
78 /*------------------------------------------------------------------------*/
79 /* AXPY */
80 void cublasSaxpy (
81     int n,
82     float alpha,
83     const(float)* x,
84     int incx,
85     float* y,
86     int incy);
87 void cublasDaxpy (
88     int n,
89     double alpha,
90     const(double)* x,
91     int incx,
92     double* y,
93     int incy);
94 void cublasCaxpy (
95     int n,
96     cuComplex alpha,
97     const(cuComplex)* x,
98     int incx,
99     cuComplex* y,
100     int incy);
101 void cublasZaxpy (
102     int n,
103     cuDoubleComplex alpha,
104     const(cuDoubleComplex)* x,
105     int incx,
106     cuDoubleComplex* y,
107     int incy);
108 
109 /*------------------------------------------------------------------------*/
110 /* COPY */
111 void cublasScopy (int n, const(float)* x, int incx, float* y, int incy);
112 void cublasDcopy (int n, const(double)* x, int incx, double* y, int incy);
113 void cublasCcopy (int n, const(cuComplex)* x, int incx, cuComplex* y, int incy);
114 void cublasZcopy (
115     int n,
116     const(cuDoubleComplex)* x,
117     int incx,
118     cuDoubleComplex* y,
119     int incy);
120 
121 /*------------------------------------------------------------------------*/
122 /* SWAP */
123 void cublasSswap (int n, float* x, int incx, float* y, int incy);
124 void cublasDswap (int n, double* x, int incx, double* y, int incy);
125 void cublasCswap (int n, cuComplex* x, int incx, cuComplex* y, int incy);
126 void cublasZswap (int n, cuDoubleComplex* x, int incx, cuDoubleComplex* y, int incy);
127 /*------------------------------------------------------------------------*/
128 /* AMAX */
129 int cublasIsamax (int n, const(float)* x, int incx);
130 int cublasIdamax (int n, const(double)* x, int incx);
131 int cublasIcamax (int n, const(cuComplex)* x, int incx);
132 int cublasIzamax (int n, const(cuDoubleComplex)* x, int incx);
133 /*------------------------------------------------------------------------*/
134 /* AMIN */
135 int cublasIsamin (int n, const(float)* x, int incx);
136 int cublasIdamin (int n, const(double)* x, int incx);
137 
138 int cublasIcamin (int n, const(cuComplex)* x, int incx);
139 int cublasIzamin (int n, const(cuDoubleComplex)* x, int incx);
140 /*------------------------------------------------------------------------*/
141 /* ASUM */
142 float cublasSasum (int n, const(float)* x, int incx);
143 double cublasDasum (int n, const(double)* x, int incx);
144 float cublasScasum (int n, const(cuComplex)* x, int incx);
145 double cublasDzasum (int n, const(cuDoubleComplex)* x, int incx);
146 /*------------------------------------------------------------------------*/
147 /* ROT */
148 void cublasSrot (
149     int n,
150     float* x,
151     int incx,
152     float* y,
153     int incy,
154     float sc,
155     float ss);
156 void cublasDrot (
157     int n,
158     double* x,
159     int incx,
160     double* y,
161     int incy,
162     double sc,
163     double ss);
164 void cublasCrot (
165     int n,
166     cuComplex* x,
167     int incx,
168     cuComplex* y,
169     int incy,
170     float c,
171     cuComplex s);
172 void cublasZrot (
173     int n,
174     cuDoubleComplex* x,
175     int incx,
176     cuDoubleComplex* y,
177     int incy,
178     double sc,
179     cuDoubleComplex cs);
180 void cublasCsrot (
181     int n,
182     cuComplex* x,
183     int incx,
184     cuComplex* y,
185     int incy,
186     float c,
187     float s);
188 void cublasZdrot (
189     int n,
190     cuDoubleComplex* x,
191     int incx,
192     cuDoubleComplex* y,
193     int incy,
194     double c,
195     double s);
196 
197 /*------------------------------------------------------------------------*/
198 /* ROTG */
199 void cublasSrotg (float* sa, float* sb, float* sc, float* ss);
200 void cublasDrotg (double* sa, double* sb, double* sc, double* ss);
201 void cublasCrotg (cuComplex* ca, cuComplex cb, float* sc, cuComplex* cs);
202 void cublasZrotg (
203     cuDoubleComplex* ca,
204     cuDoubleComplex cb,
205     double* sc,
206     cuDoubleComplex* cs);
207 
208 /*------------------------------------------------------------------------*/
209 /* ROTM */
210 void cublasSrotm (
211     int n,
212     float* x,
213     int incx,
214     float* y,
215     int incy,
216     const(float)* sparam);
217 void cublasDrotm (
218     int n,
219     double* x,
220     int incx,
221     double* y,
222     int incy,
223     const(double)* sparam);
224 
225 /*------------------------------------------------------------------------*/
226 /* ROTMG */
227 void cublasSrotmg (
228     float* sd1,
229     float* sd2,
230     float* sx1,
231     const(float)* sy1,
232     float* sparam);
233 void cublasDrotmg (
234     double* sd1,
235     double* sd2,
236     double* sx1,
237     const(double)* sy1,
238     double* sparam);
239 
240 /* --------------- CUBLAS BLAS2 functions  ---------------- */
241 /* GEMV */
242 void cublasSgemv (
243     char trans,
244     int m,
245     int n,
246     float alpha,
247     const(float)* A,
248     int lda,
249     const(float)* x,
250     int incx,
251     float beta,
252     float* y,
253     int incy);
254 void cublasDgemv (
255     char trans,
256     int m,
257     int n,
258     double alpha,
259     const(double)* A,
260     int lda,
261     const(double)* x,
262     int incx,
263     double beta,
264     double* y,
265     int incy);
266 void cublasCgemv (
267     char trans,
268     int m,
269     int n,
270     cuComplex alpha,
271     const(cuComplex)* A,
272     int lda,
273     const(cuComplex)* x,
274     int incx,
275     cuComplex beta,
276     cuComplex* y,
277     int incy);
278 void cublasZgemv (
279     char trans,
280     int m,
281     int n,
282     cuDoubleComplex alpha,
283     const(cuDoubleComplex)* A,
284     int lda,
285     const(cuDoubleComplex)* x,
286     int incx,
287     cuDoubleComplex beta,
288     cuDoubleComplex* y,
289     int incy);
290 
291 /*------------------------------------------------------------------------*/
292 /* GBMV */
293 void cublasSgbmv (
294     char trans,
295     int m,
296     int n,
297     int kl,
298     int ku,
299     float alpha,
300     const(float)* A,
301     int lda,
302     const(float)* x,
303     int incx,
304     float beta,
305     float* y,
306     int incy);
307 void cublasDgbmv (
308     char trans,
309     int m,
310     int n,
311     int kl,
312     int ku,
313     double alpha,
314     const(double)* A,
315     int lda,
316     const(double)* x,
317     int incx,
318     double beta,
319     double* y,
320     int incy);
321 void cublasCgbmv (
322     char trans,
323     int m,
324     int n,
325     int kl,
326     int ku,
327     cuComplex alpha,
328     const(cuComplex)* A,
329     int lda,
330     const(cuComplex)* x,
331     int incx,
332     cuComplex beta,
333     cuComplex* y,
334     int incy);
335 void cublasZgbmv (
336     char trans,
337     int m,
338     int n,
339     int kl,
340     int ku,
341     cuDoubleComplex alpha,
342     const(cuDoubleComplex)* A,
343     int lda,
344     const(cuDoubleComplex)* x,
345     int incx,
346     cuDoubleComplex beta,
347     cuDoubleComplex* y,
348     int incy);
349 
350 /*------------------------------------------------------------------------*/
351 /* TRMV */
352 void cublasStrmv (
353     char uplo,
354     char trans,
355     char diag,
356     int n,
357     const(float)* A,
358     int lda,
359     float* x,
360     int incx);
361 void cublasDtrmv (
362     char uplo,
363     char trans,
364     char diag,
365     int n,
366     const(double)* A,
367     int lda,
368     double* x,
369     int incx);
370 void cublasCtrmv (
371     char uplo,
372     char trans,
373     char diag,
374     int n,
375     const(cuComplex)* A,
376     int lda,
377     cuComplex* x,
378     int incx);
379 void cublasZtrmv (
380     char uplo,
381     char trans,
382     char diag,
383     int n,
384     const(cuDoubleComplex)* A,
385     int lda,
386     cuDoubleComplex* x,
387     int incx);
388 
389 /*------------------------------------------------------------------------*/
390 /* TBMV */
391 void cublasStbmv (
392     char uplo,
393     char trans,
394     char diag,
395     int n,
396     int k,
397     const(float)* A,
398     int lda,
399     float* x,
400     int incx);
401 void cublasDtbmv (
402     char uplo,
403     char trans,
404     char diag,
405     int n,
406     int k,
407     const(double)* A,
408     int lda,
409     double* x,
410     int incx);
411 void cublasCtbmv (
412     char uplo,
413     char trans,
414     char diag,
415     int n,
416     int k,
417     const(cuComplex)* A,
418     int lda,
419     cuComplex* x,
420     int incx);
421 void cublasZtbmv (
422     char uplo,
423     char trans,
424     char diag,
425     int n,
426     int k,
427     const(cuDoubleComplex)* A,
428     int lda,
429     cuDoubleComplex* x,
430     int incx);
431 
432 /*------------------------------------------------------------------------*/
433 /* TPMV */
434 void cublasStpmv (char uplo, char trans, char diag, int n, const(float)* AP, float* x, int incx);
435 
436 void cublasDtpmv (char uplo, char trans, char diag, int n, const(double)* AP, double* x, int incx);
437 
438 void cublasCtpmv (char uplo, char trans, char diag, int n, const(cuComplex)* AP, cuComplex* x, int incx);
439 
440 void cublasZtpmv (char uplo, char trans, char diag, int n, const(cuDoubleComplex)* AP, cuDoubleComplex* x, int incx);
441 /*------------------------------------------------------------------------*/
442 /* TRSV */
443 void cublasStrsv (char uplo, char trans, char diag, int n, const(float)* A, int lda, float* x, int incx);
444 
445 void cublasDtrsv (char uplo, char trans, char diag, int n, const(double)* A, int lda, double* x, int incx);
446 
447 void cublasCtrsv (char uplo, char trans, char diag, int n, const(cuComplex)* A, int lda, cuComplex* x, int incx);
448 
449 void cublasZtrsv (
450     char uplo,
451     char trans,
452     char diag,
453     int n,
454     const(cuDoubleComplex)* A,
455     int lda,
456     cuDoubleComplex* x,
457     int incx);
458 
459 /*------------------------------------------------------------------------*/
460 /* TPSV */
461 void cublasStpsv (
462     char uplo,
463     char trans,
464     char diag,
465     int n,
466     const(float)* AP,
467     float* x,
468     int incx);
469 
470 void cublasDtpsv (char uplo, char trans, char diag, int n, const(double)* AP, double* x, int incx);
471 
472 void cublasCtpsv (char uplo, char trans, char diag, int n, const(cuComplex)* AP, cuComplex* x, int incx);
473 
474 void cublasZtpsv (
475     char uplo,
476     char trans,
477     char diag,
478     int n,
479     const(cuDoubleComplex)* AP,
480     cuDoubleComplex* x,
481     int incx);
482 
483 /*------------------------------------------------------------------------*/
484 /* TBSV */
485 void cublasStbsv (
486     char uplo,
487     char trans,
488     char diag,
489     int n,
490     int k,
491     const(float)* A,
492     int lda,
493     float* x,
494     int incx);
495 
496 void cublasDtbsv (
497     char uplo,
498     char trans,
499     char diag,
500     int n,
501     int k,
502     const(double)* A,
503     int lda,
504     double* x,
505     int incx);
506 void cublasCtbsv (
507     char uplo,
508     char trans,
509     char diag,
510     int n,
511     int k,
512     const(cuComplex)* A,
513     int lda,
514     cuComplex* x,
515     int incx);
516 
517 void cublasZtbsv (
518     char uplo,
519     char trans,
520     char diag,
521     int n,
522     int k,
523     const(cuDoubleComplex)* A,
524     int lda,
525     cuDoubleComplex* x,
526     int incx);
527 
528 /*------------------------------------------------------------------------*/
529 /* SYMV/HEMV */
530 void cublasSsymv (
531     char uplo,
532     int n,
533     float alpha,
534     const(float)* A,
535     int lda,
536     const(float)* x,
537     int incx,
538     float beta,
539     float* y,
540     int incy);
541 void cublasDsymv (
542     char uplo,
543     int n,
544     double alpha,
545     const(double)* A,
546     int lda,
547     const(double)* x,
548     int incx,
549     double beta,
550     double* y,
551     int incy);
552 void cublasChemv (
553     char uplo,
554     int n,
555     cuComplex alpha,
556     const(cuComplex)* A,
557     int lda,
558     const(cuComplex)* x,
559     int incx,
560     cuComplex beta,
561     cuComplex* y,
562     int incy);
563 void cublasZhemv (
564     char uplo,
565     int n,
566     cuDoubleComplex alpha,
567     const(cuDoubleComplex)* A,
568     int lda,
569     const(cuDoubleComplex)* x,
570     int incx,
571     cuDoubleComplex beta,
572     cuDoubleComplex* y,
573     int incy);
574 
575 /*------------------------------------------------------------------------*/
576 /* SBMV/HBMV */
577 void cublasSsbmv (
578     char uplo,
579     int n,
580     int k,
581     float alpha,
582     const(float)* A,
583     int lda,
584     const(float)* x,
585     int incx,
586     float beta,
587     float* y,
588     int incy);
589 void cublasDsbmv (
590     char uplo,
591     int n,
592     int k,
593     double alpha,
594     const(double)* A,
595     int lda,
596     const(double)* x,
597     int incx,
598     double beta,
599     double* y,
600     int incy);
601 void cublasChbmv (
602     char uplo,
603     int n,
604     int k,
605     cuComplex alpha,
606     const(cuComplex)* A,
607     int lda,
608     const(cuComplex)* x,
609     int incx,
610     cuComplex beta,
611     cuComplex* y,
612     int incy);
613 void cublasZhbmv (
614     char uplo,
615     int n,
616     int k,
617     cuDoubleComplex alpha,
618     const(cuDoubleComplex)* A,
619     int lda,
620     const(cuDoubleComplex)* x,
621     int incx,
622     cuDoubleComplex beta,
623     cuDoubleComplex* y,
624     int incy);
625 
626 /*------------------------------------------------------------------------*/
627 /* SPMV/HPMV */
628 void cublasSspmv (
629     char uplo,
630     int n,
631     float alpha,
632     const(float)* AP,
633     const(float)* x,
634     int incx,
635     float beta,
636     float* y,
637     int incy);
638 void cublasDspmv (
639     char uplo,
640     int n,
641     double alpha,
642     const(double)* AP,
643     const(double)* x,
644     int incx,
645     double beta,
646     double* y,
647     int incy);
648 void cublasChpmv (
649     char uplo,
650     int n,
651     cuComplex alpha,
652     const(cuComplex)* AP,
653     const(cuComplex)* x,
654     int incx,
655     cuComplex beta,
656     cuComplex* y,
657     int incy);
658 void cublasZhpmv (
659     char uplo,
660     int n,
661     cuDoubleComplex alpha,
662     const(cuDoubleComplex)* AP,
663     const(cuDoubleComplex)* x,
664     int incx,
665     cuDoubleComplex beta,
666     cuDoubleComplex* y,
667     int incy);
668 
669 /*------------------------------------------------------------------------*/
670 /* GER */
671 void cublasSger (
672     int m,
673     int n,
674     float alpha,
675     const(float)* x,
676     int incx,
677     const(float)* y,
678     int incy,
679     float* A,
680     int lda);
681 void cublasDger (
682     int m,
683     int n,
684     double alpha,
685     const(double)* x,
686     int incx,
687     const(double)* y,
688     int incy,
689     double* A,
690     int lda);
691 
692 void cublasCgeru (
693     int m,
694     int n,
695     cuComplex alpha,
696     const(cuComplex)* x,
697     int incx,
698     const(cuComplex)* y,
699     int incy,
700     cuComplex* A,
701     int lda);
702 void cublasCgerc (
703     int m,
704     int n,
705     cuComplex alpha,
706     const(cuComplex)* x,
707     int incx,
708     const(cuComplex)* y,
709     int incy,
710     cuComplex* A,
711     int lda);
712 void cublasZgeru (
713     int m,
714     int n,
715     cuDoubleComplex alpha,
716     const(cuDoubleComplex)* x,
717     int incx,
718     const(cuDoubleComplex)* y,
719     int incy,
720     cuDoubleComplex* A,
721     int lda);
722 void cublasZgerc (
723     int m,
724     int n,
725     cuDoubleComplex alpha,
726     const(cuDoubleComplex)* x,
727     int incx,
728     const(cuDoubleComplex)* y,
729     int incy,
730     cuDoubleComplex* A,
731     int lda);
732 
733 /*------------------------------------------------------------------------*/
734 /* SYR/HER */
735 void cublasSsyr (
736     char uplo,
737     int n,
738     float alpha,
739     const(float)* x,
740     int incx,
741     float* A,
742     int lda);
743 void cublasDsyr (
744     char uplo,
745     int n,
746     double alpha,
747     const(double)* x,
748     int incx,
749     double* A,
750     int lda);
751 
752 void cublasCher (
753     char uplo,
754     int n,
755     float alpha,
756     const(cuComplex)* x,
757     int incx,
758     cuComplex* A,
759     int lda);
760 void cublasZher (
761     char uplo,
762     int n,
763     double alpha,
764     const(cuDoubleComplex)* x,
765     int incx,
766     cuDoubleComplex* A,
767     int lda);
768 
769 /*------------------------------------------------------------------------*/
770 /* SPR/HPR */
771 void cublasSspr (
772     char uplo,
773     int n,
774     float alpha,
775     const(float)* x,
776     int incx,
777     float* AP);
778 void cublasDspr (
779     char uplo,
780     int n,
781     double alpha,
782     const(double)* x,
783     int incx,
784     double* AP);
785 void cublasChpr (
786     char uplo,
787     int n,
788     float alpha,
789     const(cuComplex)* x,
790     int incx,
791     cuComplex* AP);
792 void cublasZhpr (
793     char uplo,
794     int n,
795     double alpha,
796     const(cuDoubleComplex)* x,
797     int incx,
798     cuDoubleComplex* AP);
799 
800 /*------------------------------------------------------------------------*/
801 /* SYR2/HER2 */
802 void cublasSsyr2 (
803     char uplo,
804     int n,
805     float alpha,
806     const(float)* x,
807     int incx,
808     const(float)* y,
809     int incy,
810     float* A,
811     int lda);
812 void cublasDsyr2 (
813     char uplo,
814     int n,
815     double alpha,
816     const(double)* x,
817     int incx,
818     const(double)* y,
819     int incy,
820     double* A,
821     int lda);
822 void cublasCher2 (
823     char uplo,
824     int n,
825     cuComplex alpha,
826     const(cuComplex)* x,
827     int incx,
828     const(cuComplex)* y,
829     int incy,
830     cuComplex* A,
831     int lda);
832 void cublasZher2 (
833     char uplo,
834     int n,
835     cuDoubleComplex alpha,
836     const(cuDoubleComplex)* x,
837     int incx,
838     const(cuDoubleComplex)* y,
839     int incy,
840     cuDoubleComplex* A,
841     int lda);
842 
843 /*------------------------------------------------------------------------*/
844 /* SPR2/HPR2 */
845 void cublasSspr2 (
846     char uplo,
847     int n,
848     float alpha,
849     const(float)* x,
850     int incx,
851     const(float)* y,
852     int incy,
853     float* AP);
854 void cublasDspr2 (
855     char uplo,
856     int n,
857     double alpha,
858     const(double)* x,
859     int incx,
860     const(double)* y,
861     int incy,
862     double* AP);
863 void cublasChpr2 (
864     char uplo,
865     int n,
866     cuComplex alpha,
867     const(cuComplex)* x,
868     int incx,
869     const(cuComplex)* y,
870     int incy,
871     cuComplex* AP);
872 void cublasZhpr2 (
873     char uplo,
874     int n,
875     cuDoubleComplex alpha,
876     const(cuDoubleComplex)* x,
877     int incx,
878     const(cuDoubleComplex)* y,
879     int incy,
880     cuDoubleComplex* AP);
881 
882 /* ------------------------BLAS3 Functions ------------------------------- */
883 /* GEMM */
884 void cublasSgemm (
885     char transa,
886     char transb,
887     int m,
888     int n,
889     int k,
890     float alpha,
891     const(float)* A,
892     int lda,
893     const(float)* B,
894     int ldb,
895     float beta,
896     float* C,
897     int ldc);
898 void cublasDgemm (
899     char transa,
900     char transb,
901     int m,
902     int n,
903     int k,
904     double alpha,
905     const(double)* A,
906     int lda,
907     const(double)* B,
908     int ldb,
909     double beta,
910     double* C,
911     int ldc);
912 void cublasCgemm (
913     char transa,
914     char transb,
915     int m,
916     int n,
917     int k,
918     cuComplex alpha,
919     const(cuComplex)* A,
920     int lda,
921     const(cuComplex)* B,
922     int ldb,
923     cuComplex beta,
924     cuComplex* C,
925     int ldc);
926 void cublasZgemm (
927     char transa,
928     char transb,
929     int m,
930     int n,
931     int k,
932     cuDoubleComplex alpha,
933     const(cuDoubleComplex)* A,
934     int lda,
935     const(cuDoubleComplex)* B,
936     int ldb,
937     cuDoubleComplex beta,
938     cuDoubleComplex* C,
939     int ldc);
940 
941 /* -------------------------------------------------------*/
942 /* SYRK */
943 void cublasSsyrk (
944     char uplo,
945     char trans,
946     int n,
947     int k,
948     float alpha,
949     const(float)* A,
950     int lda,
951     float beta,
952     float* C,
953     int ldc);
954 void cublasDsyrk (
955     char uplo,
956     char trans,
957     int n,
958     int k,
959     double alpha,
960     const(double)* A,
961     int lda,
962     double beta,
963     double* C,
964     int ldc);
965 
966 void cublasCsyrk (
967     char uplo,
968     char trans,
969     int n,
970     int k,
971     cuComplex alpha,
972     const(cuComplex)* A,
973     int lda,
974     cuComplex beta,
975     cuComplex* C,
976     int ldc);
977 void cublasZsyrk (
978     char uplo,
979     char trans,
980     int n,
981     int k,
982     cuDoubleComplex alpha,
983     const(cuDoubleComplex)* A,
984     int lda,
985     cuDoubleComplex beta,
986     cuDoubleComplex* C,
987     int ldc);
988 
989 /* ------------------------------------------------------- */
990 /* HERK */
991 void cublasCherk (
992     char uplo,
993     char trans,
994     int n,
995     int k,
996     float alpha,
997     const(cuComplex)* A,
998     int lda,
999     float beta,
1000     cuComplex* C,
1001     int ldc);
1002 void cublasZherk (
1003     char uplo,
1004     char trans,
1005     int n,
1006     int k,
1007     double alpha,
1008     const(cuDoubleComplex)* A,
1009     int lda,
1010     double beta,
1011     cuDoubleComplex* C,
1012     int ldc);
1013 
1014 /* ------------------------------------------------------- */
1015 /* SYR2K */
1016 void cublasSsyr2k (
1017     char uplo,
1018     char trans,
1019     int n,
1020     int k,
1021     float alpha,
1022     const(float)* A,
1023     int lda,
1024     const(float)* B,
1025     int ldb,
1026     float beta,
1027     float* C,
1028     int ldc);
1029 
1030 void cublasDsyr2k (
1031     char uplo,
1032     char trans,
1033     int n,
1034     int k,
1035     double alpha,
1036     const(double)* A,
1037     int lda,
1038     const(double)* B,
1039     int ldb,
1040     double beta,
1041     double* C,
1042     int ldc);
1043 void cublasCsyr2k (
1044     char uplo,
1045     char trans,
1046     int n,
1047     int k,
1048     cuComplex alpha,
1049     const(cuComplex)* A,
1050     int lda,
1051     const(cuComplex)* B,
1052     int ldb,
1053     cuComplex beta,
1054     cuComplex* C,
1055     int ldc);
1056 
1057 void cublasZsyr2k (
1058     char uplo,
1059     char trans,
1060     int n,
1061     int k,
1062     cuDoubleComplex alpha,
1063     const(cuDoubleComplex)* A,
1064     int lda,
1065     const(cuDoubleComplex)* B,
1066     int ldb,
1067     cuDoubleComplex beta,
1068     cuDoubleComplex* C,
1069     int ldc);
1070 
1071 /* ------------------------------------------------------- */
1072 /* HER2K */
1073 void cublasCher2k (
1074     char uplo,
1075     char trans,
1076     int n,
1077     int k,
1078     cuComplex alpha,
1079     const(cuComplex)* A,
1080     int lda,
1081     const(cuComplex)* B,
1082     int ldb,
1083     float beta,
1084     cuComplex* C,
1085     int ldc);
1086 
1087 void cublasZher2k (
1088     char uplo,
1089     char trans,
1090     int n,
1091     int k,
1092     cuDoubleComplex alpha,
1093     const(cuDoubleComplex)* A,
1094     int lda,
1095     const(cuDoubleComplex)* B,
1096     int ldb,
1097     double beta,
1098     cuDoubleComplex* C,
1099     int ldc);
1100 
1101 /*------------------------------------------------------------------------*/
1102 /* SYMM*/
1103 void cublasSsymm (
1104     char side,
1105     char uplo,
1106     int m,
1107     int n,
1108     float alpha,
1109     const(float)* A,
1110     int lda,
1111     const(float)* B,
1112     int ldb,
1113     float beta,
1114     float* C,
1115     int ldc);
1116 void cublasDsymm (
1117     char side,
1118     char uplo,
1119     int m,
1120     int n,
1121     double alpha,
1122     const(double)* A,
1123     int lda,
1124     const(double)* B,
1125     int ldb,
1126     double beta,
1127     double* C,
1128     int ldc);
1129 
1130 void cublasCsymm (
1131     char side,
1132     char uplo,
1133     int m,
1134     int n,
1135     cuComplex alpha,
1136     const(cuComplex)* A,
1137     int lda,
1138     const(cuComplex)* B,
1139     int ldb,
1140     cuComplex beta,
1141     cuComplex* C,
1142     int ldc);
1143 
1144 void cublasZsymm (
1145     char side,
1146     char uplo,
1147     int m,
1148     int n,
1149     cuDoubleComplex alpha,
1150     const(cuDoubleComplex)* A,
1151     int lda,
1152     const(cuDoubleComplex)* B,
1153     int ldb,
1154     cuDoubleComplex beta,
1155     cuDoubleComplex* C,
1156     int ldc);
1157 
1158 /*------------------------------------------------------------------------*/
1159 /* HEMM*/
1160 void cublasChemm (
1161     char side,
1162     char uplo,
1163     int m,
1164     int n,
1165     cuComplex alpha,
1166     const(cuComplex)* A,
1167     int lda,
1168     const(cuComplex)* B,
1169     int ldb,
1170     cuComplex beta,
1171     cuComplex* C,
1172     int ldc);
1173 void cublasZhemm (
1174     char side,
1175     char uplo,
1176     int m,
1177     int n,
1178     cuDoubleComplex alpha,
1179     const(cuDoubleComplex)* A,
1180     int lda,
1181     const(cuDoubleComplex)* B,
1182     int ldb,
1183     cuDoubleComplex beta,
1184     cuDoubleComplex* C,
1185     int ldc);
1186 
1187 /*------------------------------------------------------------------------*/
1188 /* TRSM*/
1189 void cublasStrsm (
1190     char side,
1191     char uplo,
1192     char transa,
1193     char diag,
1194     int m,
1195     int n,
1196     float alpha,
1197     const(float)* A,
1198     int lda,
1199     float* B,
1200     int ldb);
1201 
1202 void cublasDtrsm (
1203     char side,
1204     char uplo,
1205     char transa,
1206     char diag,
1207     int m,
1208     int n,
1209     double alpha,
1210     const(double)* A,
1211     int lda,
1212     double* B,
1213     int ldb);
1214 
1215 void cublasCtrsm (
1216     char side,
1217     char uplo,
1218     char transa,
1219     char diag,
1220     int m,
1221     int n,
1222     cuComplex alpha,
1223     const(cuComplex)* A,
1224     int lda,
1225     cuComplex* B,
1226     int ldb);
1227 
1228 void cublasZtrsm (
1229     char side,
1230     char uplo,
1231     char transa,
1232     char diag,
1233     int m,
1234     int n,
1235     cuDoubleComplex alpha,
1236     const(cuDoubleComplex)* A,
1237     int lda,
1238     cuDoubleComplex* B,
1239     int ldb);
1240 
1241 /*------------------------------------------------------------------------*/
1242 /* TRMM*/
1243 void cublasStrmm (
1244     char side,
1245     char uplo,
1246     char transa,
1247     char diag,
1248     int m,
1249     int n,
1250     float alpha,
1251     const(float)* A,
1252     int lda,
1253     float* B,
1254     int ldb);
1255 void cublasDtrmm (
1256     char side,
1257     char uplo,
1258     char transa,
1259     char diag,
1260     int m,
1261     int n,
1262     double alpha,
1263     const(double)* A,
1264     int lda,
1265     double* B,
1266     int ldb);
1267 void cublasCtrmm (
1268     char side,
1269     char uplo,
1270     char transa,
1271     char diag,
1272     int m,
1273     int n,
1274     cuComplex alpha,
1275     const(cuComplex)* A,
1276     int lda,
1277     cuComplex* B,
1278     int ldb);
1279 void cublasZtrmm (
1280     char side,
1281     char uplo,
1282     char transa,
1283     char diag,
1284     int m,
1285     int n,
1286     cuDoubleComplex alpha,
1287     const(cuDoubleComplex)* A,
1288     int lda,
1289     cuDoubleComplex* B,
1290     int ldb);